home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.17 / pcq-programme / game / game.doc < prev    next >
Text File  |  1995-04-22  |  28KB  |  682 lines

  1.  
  2.  
  3.  
  4.                   Dokumentation Game.i
  5.                   --------------------
  6. Einleitung
  7. ----------
  8.  
  9.     Was macht man (oder Frau), wenn man ein Spiel programmieren will?
  10.     Man macht sich schlau! Und warum? Weil nur wenige Leute Informationen
  11.     über die Spieleprogrammierung veröffentlichen oder man bekommt
  12.     überhaupt keine Infos (so wie ich).
  13.  
  14.     Aber damit ist jetzt Schluß!!!
  15.  
  16.     Warum? Na, ich will euch mit den von mir programmierten Funktionen
  17.     und Ideen dazu bewegen, eigene Spiele zu entwickeln.
  18.  
  19.     Ziel ist es, daß die Routinen so leicht wie möglich aufzurufen
  20.     sind und so effektiv wie möglich arbeiten.
  21.     Ein weiteres Ziel: Jeder soll sie verstehen!!
  22.     Und noch ein weiters Ziel: Es ist egal, ob die Routinen in
  23.     PCQ-Pascal geschrieben sind oder in Assembler (wobei natürlich
  24.     PCQ-Pascal zu bevorzugen ist), hauptsache sie laufen, passen in
  25.     das Gesamtkonzept und sind getestet.
  26.  
  27.     Oh Gott, hoffentlich sind das nicht zu hoch gesteckte Ziele, aber
  28.     wer weiß, wenn ihr voll mit dabei seit, so ist es kein Problem.
  29.  
  30.     Ich (und auch andere) setzen auf euch !!!
  31.  
  32.     Wenn ihr jetzt denkt, daß ein Spiel in Pascal unmöglich zu schreiben
  33.     ist, dann werde ich euch mit meinem ersten Spiel "TakeIt"
  34.     überzeugen. Fertig solls Ende Juli '92 sein.
  35.  
  36.     Soweit zum Vorwort. Und was kommt jetzt?
  37.     Na, die Erläuterung meiner Routinen und Strukturen aus "Game.i"
  38.     natürlich.
  39.     Also fangen wir an.
  40.  
  41.     a) Die zu verwendenden Typen, Constanten und Variablen
  42.  
  43.         - ObjektDef
  44.  
  45.             Dieses ist die eigentliche Struktur für die Definition von
  46.             Spielobjekten. Wenn ihr genauer hinschaut werdet ihr sehen,
  47.             daß sich aus der Graphics.Lib viele Sachen wiederspiegeln
  48.             die dort mit den AnimObjekts verwendet werden.
  49.  
  50.             Ich habe bloß keine Lust, das umständliche Handling der
  51.             Graphics.Lib zu nutzen inkl. der sehr großen Strukturen.
  52.  
  53.             "Na ist den der verrückt geworden?" werdet ihr jetzt denken.
  54.             Nein, ich bin nur jemand, der Wert auf Geschwindigkeit und
  55.             Einfachheit legt und deshalb nicht die AnimObjekt-Routinen
  56.             nutzt. Die laß ich lieber den Basic-Programmieren übrig
  57.             ( hiervon kann jeder reden, der mal die Routinen genutzt hat.
  58.             Einfach Grauenhaft!!!).
  59.  
  60.             Schaut euch die ObjektDef genau an, ihr werdet sie noch oft
  61.             in meinen Routinen sehen.
  62.  
  63.         - Objektsitze
  64.  
  65.             Definiert die Größe eines Objektes in Byte für die Funktion
  66.             CollObjekt (siehe unten).
  67.  
  68.         - Objekt
  69.  
  70.             Ist ein Array von max. 256 Objekten. Dient als eigentliche
  71.             "Spielwiese" für meine Soielobjekte, da hier alle erforder-
  72.             lichen Daten abgelegt sind.
  73.  
  74.         - Picture
  75.  
  76.             Ist wieder ein Kernstück der Routinen. Mit Picture de-
  77.             finiere ich mir ein Array mit 100 Imagepointern aus
  78.             Intuition.
  79.  
  80.             Warum denn das?
  81.             Nun, um Objekt auf den Bildschirm zu bringen kann man Punkte
  82.             verwenden (viel zu aufwendig), Linien (nicht immer zu
  83.             gebrauchen), den Zeichensatz (sehr unflexibel), die Bobs
  84.             (will ich nicht wegen dem Handling) oder die Images.
  85.  
  86.             Was ist der Vorteil der Images?
  87.             Also eins Vorweg: sie werden vom Blitter gezeichnet und sind
  88.             deshalb unheimlich schnell auf dem Bildschirm (siehe auch
  89.             das Testprogramm). Außerdem muß ich nicht in die Blitter-
  90.             programmierung einsteigen.
  91.             Und zum anderen sind Images sehr flexibel: die Höhe und
  92.             Breite ist vorgebbar, die Anzahl der verwendeten Bitplanes
  93.             und, was auch sehr wichtig ist, die verwendeten Farben
  94.             lassen sich sehr einfach ansteuern.
  95.  
  96.             Deshalb habe ich mich für die Images entschieden.
  97.             In einer zukünftigen Version werde ich vielleicht eine
  98.             andere, schnellere Routine verwenden (kennt jemand eine,
  99.             die genau das selbe tut, nur schneller?).
  100.  
  101.         - blitctrl
  102.  
  103.             Wird als Globale Variable UNBEDINGT FÜR DIE BLITTERERGEBNISSE
  104.             aus der Funktion "Graphcollision" verwendet.
  105.  
  106.         - Blittispeicher
  107.  
  108.             Ja, den müßt ihr selber initialisieren. Und zwar sollte er
  109.             so groß sein wie das größte von euch benutzte Objekt ist.
  110.             Ansonsten macht der Amiga einen Abgang ......
  111.  
  112.         - MyBitMap
  113.  
  114.             Muß die Adresse der BitMap sein. NICHT die Adresse der
  115.             BitPlanes!!!
  116.  
  117.         - MyRPort
  118.  
  119.             Muß der Zeiger auf den dazugehörigen Rastport sein.
  120.  
  121.     Außerdem fehlt noch eine wichtige Sache: die Graphics.Lib MUß VOM
  122.     HAUPTPROGRAMM ERÖFFNET SEIN!!! Ansonsten hol's der Guru.....
  123.  
  124.     Schön und gut, das waren erst einmal alle Konstanten, Variablen und
  125.     Strukturen. Und was kommt jetzt? Logo, die Funktionen. Wenn ihr
  126.     detailierte Informationen haben wollt, so schaut in dem entsprechen-
  127.     den Directory nach, sofern dieses vorhanden ist.
  128.  
  129.     b) Die verwendeten Proceduren und Functionen
  130.  
  131. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  132.         1) Procedure GraphCollision( x1, y1, xsize, ysize : short);
  133.  
  134.            Diese Funktion testet den rechteckigen Bereich mit den
  135.            Eckpunkten x1, y1, x1+xsize, y1+ysize, ob in diesem ein
  136.            Punkt gesetz ist.
  137.  
  138.            Aufgerufen wird die Prozedur mit
  139.  
  140.                     GraphCollision(x1, y1, xsize, ysize);
  141.  
  142.            Alle Werte müßen vom Typ Short sein. x1 und y1 bezeichnen den
  143.            oben links stehenden Punkt in einem Rechteck. Der unten rechts
  144.            stehende Punkt wird aus der Addition mit den x- bzw. y-Size
  145.            Werten durch das Betriebssystem ermittelt.
  146.  
  147.            Zu beachten ist, daß meine Routinen folgende Globale Werte
  148.            im Hauptprogramm voraussetzt:
  149.  
  150.            - MyBitMap     ---> Ein Zeiger auf die zu bearbeitende BitMap
  151.                                ( siehe auch das TestProgramm ).
  152.            - Graphics.Lib ---> Diese MUß im Hauptprogramm ERFOLGREICH geöffnet
  153.                                worden sein. Sonst gibts den GURU !
  154.  
  155.            - blitctrl     ---> Enthält nach dem Aufruf den Wert 0 (in
  156.                                dem untersuchten Grfikblock gab es keinen
  157.                                gesetzten Punkt) oder 1 (es war mind.
  158.                                ein Punkt gesetzt).
  159.  
  160.  
  161.            Nach Ende der Prozedur braucht man nur in der Variablen
  162.            blitctrl nachzusehen, ob eine Kollision vorgekommen ist!
  163.  
  164.         Recht einfach, oder? Aber es wird noch lustiger:
  165.  
  166. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  167.  
  168.         2) Function CollObjekt(von, bis, x1, y1, sizex, sizey : short)
  169.            : short;
  170.  
  171.            Die Funktion ermittelt, welches Objekt in dem Rechteck
  172.            x1, y1, x1+Sizex und y1+Sizey kollidiert ist.
  173.  
  174.            Hierbei kann ein von / bis Bereich für die Objektuntersuchung
  175.            angegeben werden (0 - 255 ).
  176.            Wird als Von-Wert -1 angegeben, so werden alle Objekte
  177.            untersucht und die erste Objektnummer, die zur Kollision
  178.            führte, zurück gegeben.
  179.  
  180.            Ist der Rückgabewert -1, so gab es eine Kolision mit einem
  181.            nicht definierten Objekt bzw. das Objekt wurde nicht gefunden.
  182.  
  183.            Die Funktion selber untersucht das definierte Array "Objekt"
  184.            nach folgendem Schema (tut mir leid, passte nicht auf einen
  185.            normalen Bildschirm rauf):
  186.  
  187. ----------------------------------------------------------------------------------------------------
  188.  
  189.            Treffervergleich (O = Objekt, T = Trefferbereich)
  190.  
  191.            Ox1 >= Tx1 und Ox1 =< Tx2    == Ja ==>    Oy1 >= Ty1 und Oy1 <= Ty2   == Ja ==>   Treffer
  192.                      !                         ^                !                       ^
  193.                      !                         !                !                       !
  194.                    Nein                        !              Nein                      !
  195.                      !                         !                !                       !
  196.                      V                         !                V                       !
  197.            Ox2 >= Tx1 und Ox2 =< Tx2    == Ja -+     Oy2 >= Ty1 und Oy2 <= Ty2   == Ja -+
  198.                      !                         ^                !                       ^
  199.                      !                         !                !                       !
  200.                    Nein                        !              Nein                      !
  201.                      !                         !                !                       !
  202.                      V                         !                V                       !
  203.            Tx1 >= Ox1 und Tx1 =< Ox2    == Ja -+     Ty1 >= Oy1 und Ty1 <= Oy2   == Ja -+
  204.                      !                         ^                !                       ^
  205.                      !                         !                !                       !
  206.                    Nein                        !              Nein                      !
  207.                      !                         !                !                       !
  208.                      V                         !                V                       !
  209.            Tx2 >= Ox1 und Tx2 =< Ox2    == Ja -+     Ty2 >= Oy1 und Ty2 <= Oy2   == Ja -+
  210.                      !                                          !
  211.                      !                                          !
  212.                    Nein                                       Nein
  213.                      !                                          !
  214.                      V                                          V
  215.                Kein Treffer                               Kein Treffer
  216.  
  217. ----------------------------------------------------------------------------------------------------
  218.            Wer jetzt sagt "Oh Gott, was ist das für eine komplizierte
  219.            Abfrage" dem kann ich nur Recht geben. Aber schaut euch
  220.            bitte auch das Testprogramm an.
  221.  
  222.            Und wenn das nicht hilft, dann macht es wie ich: malt euch
  223.            auf ein Blatt Papier alle Variationsmöglichkeiten, an dem
  224.            es Kollisionen zwischen Objekten geben kann (auch zwischen
  225.            unterschiedlich großen).
  226.  
  227.            Das Stück hat mich einige Jahre altern lassen!!!
  228.            Ganz zu schweigen von der Zeit. Aber ich habe es ausgiebig
  229.            getestet, weil mit dieser Routine eine Kollisionserkennung
  230.            steht und fällt.
  231.  
  232.            UND SIE STEHT!!!
  233.  
  234.            Sicher, man kann noch einiges zur Beschleunigung tun (auch
  235.            wenn sie jetzt schon, wie mir Tests gezeigt haben, sehr
  236.            schnell ist), aber ich hatte einfach keine Zeit mehr dafür.
  237.  
  238.            In einem späteren Release werde ich sicherlich noch einige
  239.            Minuten dafür verwenden, um sie zu optimieren.
  240.  
  241. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  242.  
  243.         3) Procedure DrawObjekt( VonNr, BisNr : short);
  244.  
  245.            Diese Routine zeichnet ein oder mehrere definierte(s)
  246.            Objekt(e), die im IMAGE-Format vorliegen müssen.
  247.            Und dieses alles mit einer eigenen Blitter-Routine (schaut
  248.            sie euch an, hab einige Stunden Lehrgeld zahlen müssen).
  249.  
  250. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  251.  
  252.         4) Procedure UnDrawObjekt( VonNr, BisNr : short );
  253.  
  254.            Diese Routine löscht die mit VonNr bis BisNr gekennzeichnete
  255.            Objekte auf dem Bildschirm.
  256.  
  257.            Ihr seht, es gibt auch einfache Routinen.
  258.  
  259. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  260.  
  261.         5) Function GetChar() : byte;
  262.  
  263.            Diese Funktion greift direkt auf die Hardwareregister zu und
  264.            ermittelt die gedrückte Taste.
  265.            Der zurückgegeben Wert ist aber NICHT der ASCII-Wert sondern
  266.            vielmehr das Zeichen im "rohen" Format.
  267.  
  268.            Hierzu einige Werte:
  269.                           - AMIGA-links   : $33
  270.                           - AMIGA-rechts  : $31
  271.                           - DEL           : $73
  272.                           - Cursor hoch   : 103
  273.                           - Cursor runter : 101
  274.                           - Cursor rechts :  99
  275.                           - Cursor links  :  97
  276.  
  277. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  278.  
  279.         6) Function GetJoy2(): byte;
  280.  
  281.            Diese Funktion fragt über die Hardwareregister den Joystick
  282.            am Port 2 ab und gibt folgende Wert zurück:
  283.  
  284.               --->   0 - Joystick wurde nicht berührt
  285.               --->   1 - Joystick nach rechts
  286.               --->   2 - Joystick nach links
  287.               --->   4 - Joystick nach hinten
  288.               --->   8 - Joystick nach vorne
  289.               --->  16 - Feuertaste gedrückt.
  290.  
  291.            Zu beachten ist, das jeweils nur das entsprechende Bit
  292.            gesetzt wird, so das es sehr leicht ist, auch mehrere
  293.            Aktionen gleichzeitig abzufragen (z.B. Joystick nach
  294.            rechts und hinten und gleichzeitig wurde die Feuertaste
  295.            gedrückt).
  296.  
  297. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  298.  
  299.         7) Function ChipCopy( Source : Address; Size : integer)
  300.            : Address;
  301.  
  302.            Eine ungeheuer nützlich Funktion (jedenfalls für mich).
  303.  
  304.            Sie allokiert ChipMem in der Größe Size und kopiert die
  305.            Daten von der Addresse Source dort hinein.
  306.            Zurückgegeben wird die ChipMeM-Adresse für die weitere
  307.            Verwendung.
  308.  
  309.            Da eine Programmierung über Pascal zu umständlich war, habe
  310.            ich das ganze über Assembler programmiert (siehe Source).
  311.  
  312. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  313.  
  314.         8) Procedure IntToStr6(s : string; i : integer);
  315.  
  316.            Diese Procedure konvertiert positive Zahlen in das
  317.            Stringformat mit führenden Nullen.
  318.            Max. 6 Nullen und max. ist die Zahl 999999 erlaubt.
  319.  
  320. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  321.  
  322.         9) Procedure PowerLEDOn();
  323.  
  324.            Ja, Ja, was könnte diese Procedure und die folgende
  325.            wohl machen?
  326.            Dieses beiden sind aus der Tatsache entstanden, daß ich
  327.            nicht immer Bock hatte, in Handbüchern nachzusehen, wo
  328.            wohl die entsprechenden Adressen sind und was man in diese
  329.            hineinschreiben sollte.
  330.  
  331. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  332.  
  333.        10) Procedure PowerLEDOff();
  334.  
  335.            Ja, Ja, was könnte diese Procedure wohl machen?
  336.  
  337. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  338.  
  339.        11. Procedure InitVB();
  340.  
  341.            Diese Prozedur initialisiert, natürlich Systemkonform, einen
  342.            Vertikal-Blank-Server.
  343.  
  344. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  345.  
  346.        12. Procedure Exitvb();
  347.  
  348.            Diese Prozedur gibt den VB-Server wieder frei.
  349.  
  350. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  351.  
  352.        13. Procedure Settime();
  353.  
  354.            Diese Prozedur setzt den Startwert des Zählers für den
  355.            Vertikal-Blank-Counter wieder auf 0.
  356.  
  357.            Ohne Probleme kann das zurücksetzen erfolgen, wann immer
  358.            und wie oft auch immer dieses gewünscht ist.
  359.  
  360. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  361.  
  362.        14. Function Gettime(): integer;
  363.  
  364.            Diese Prozedur liefert den Wert des VB-Server-Zähler zurück.
  365.  
  366. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  367.  
  368.        15. Procedure WaitVB(ticks : short);
  369.  
  370.            Und Zum Schluß, für diesen Bereich, etwas ganz simples:
  371.            WaitVB wartet soviele ticks ab, wie ihr angebt.
  372.  
  373.            Die Verwendung schaut euch mal im neuen UFO-Game an.
  374.  
  375. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  376.  
  377.        16. Function LoadSample(Nummer : byte; name : String): short;
  378.  
  379.            Lädt ein IFF-8SVX Sample und gibt diesem alle erforderlichen
  380.            Werte mit.
  381.  
  382.            Es MUß sich um ein 8SVX-Sample handeln!
  383.  
  384.            Folgende Rückgaben sind möglich:
  385.  
  386.                  0 ---> Sample konnte O.K. initialisiert werden.
  387.                 -1 ---> File konnte nicht geöffnet werden.
  388.                 -2 ---> Kein Filename.
  389.                 -3 ---> Sampleplatz schon belegt.
  390.                 -4 ---> Kein IFF-8SVX-File.
  391.                 -7 ---> Kein Speicher für Sample.
  392.                 -9 ---> Kein Speicher für Dekompression.
  393.                -10 ---> Unbekannter Kompression-Type.
  394.  
  395. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  396.  
  397.        17. Procedure PlaySample(nummer : short);
  398.  
  399.            Spielt den in der Sampletab abgelegten Sound ab.
  400.  
  401.            Diese Assemblerroutine ist NICHT systemkonform, aber mir fiel
  402.            partout nichts besseres ein, was ich machen sollte.
  403.  
  404. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  405.  
  406.        18. Procedure FreeSample(Nummer: byte);
  407.  
  408.            Gibt das Sample mit der Nummer nummer aus der Sampletab wieder
  409.            frei inkl. aller belegter Speicherbereiche.
  410.  
  411.     c) So, das wars erstmal.
  412.        Als Beispielprogramm für die Verwendung der Routinen schaut euch
  413.        UFO2 an, welches auch von mir geschrieben worden ist.
  414.  
  415.        Nichts desto trotz liegt es an euch, ob ihr nicht auch
  416.        entsprechende Routinen schreiben wollt
  417.        (welche noch zu entwickeln wären steht weiter unten).
  418.  
  419.        Oder setzt euch an eure Freundin und probiert mit den hier
  420.        vorgestellten Routinen aus, ob ihr was auf die Beine stellt.
  421.        Die Grundausstattung habt ihr und es gilt weiterhin der alte
  422.        Spruch: "Jeder ist seines Glückes Schmied".
  423.  
  424. Aufruf, Übergabeparameter
  425. -------------------------
  426.  
  427.     Siehe in der obigen Dokumentation.
  428.  
  429. Einbindung in eigene Programme
  430. ------------------------------
  431.  
  432.     Hierzu sind folgende Dinge erforderlich:
  433.  
  434.         a) Im Sourcecode ist die Datei "GAME.I" als Include -File
  435.            einzubauen, damit der Compiler auch weiß, was er machen
  436.            soll.
  437.  
  438.         b) Der Linkeraufruf ist wie folgt zu modifizieren:
  439.  
  440.                blink <source>.o to <source> library PCQ.lib Game.Lib
  441.  
  442. Erklärung des Source-Codes
  443. --------------------------
  444.  
  445.     Ich glaube, eine Erklärung erübrigt sich, da ich die einzelnen
  446.     Schritte dokumentiert habe.
  447.  
  448. Sonstiges
  449. ---------
  450.  
  451.     Also fangen wir mal wieder an:
  452.  
  453.         a) Die Funktionen sind ALLE von mir ausreichend getestet
  454.            worden. Sie laufen einwandfrei unter der Voraussetzung,
  455.            das man für den Rastport eine WindowRastport wählt!
  456.  
  457.            Warum das so ist weiß ich nicht. Ich weiß nur, das alle
  458.            Versuche, mit einem ScreenRastport zu arbeiten (wg. der
  459.            Ersparnis des gesamten Windowhandlings), mit einer Reise
  460.            zum Guru aufgehört haben.
  461.  
  462.            Vielleicht kann mir ja einer von euch sagen, warum dieses
  463.            so ist. Ich habs nicht verstanden.
  464.  
  465.         b) Die Zeit, die ich in diese Routinen investiert habe, sehe
  466.            ich als sehr groß an (bewegt sich so ca. zwischen 40 - 80
  467.            Stunden inkl. aller Test und Abstürze).
  468.            Deshalb solltet ihr nach Möglichkeit nicht auch nochmal
  469.            versuchen, daß Rad ein zweites Mal zu erfinden! Ich kann
  470.            euch nur warnen. Wer nicht gewarnt sein will, den belegt
  471.            der Gurumaster mit einer langen Zeit schlafloser Nächte,
  472.            vielen Zigaretten (sofern ihr Raucher seid) und jeder
  473.            Menge Kaffee (am anderen Morgen).
  474.  
  475.            Die Testzeit habe ich als sehr kritisch angesehen, da ich
  476.            der Meinung bin, das nur wirklich ausgetestete Programme
  477.            an andere weitergegeben werden sollten.
  478.  
  479.         c) Verbesserungen
  480.  
  481.            O.K., O.K., nicht alle Routinen sind das gelbe vom Ei. Vieles
  482.            könnte sicher noch weiter optimiert werden. Wenn ich die
  483.            entsprechende Zeit habe werde ich mich auch daran setzen.
  484.            Oder wollt ihr dieses vornehmen? Wenn ja, dann schickt mir
  485.            doch bitte eine Diskette mit den Änderungen die ihr
  486.            vorgenommen habt.
  487.  
  488.            Nur um eins möchte ich euch bitten: bleibt bei der
  489.            ObjektDef! Nicht, das ich hierüber das Ja und Amen ausspreche,
  490.            aber solange mir keiner sagen kann, warum die Struktur
  491.            unbedingt erweitert werden müßte, solltet ihr diese auch
  492.            bei euren Programmen nicht weiter verändern.
  493.  
  494.            Falls doch, so laßt uns erstmal darüber diskutiern. Auch ich
  495.            kann noch was lernen.
  496.  
  497.            Und denkt bitte dran: eine ausreichende Dokumentation sollte
  498.            schon sein, sonst ist keinem damit geholfen, weder dem Ein-
  499.            steiger, der verzweifelt ist, weil er den Source nicht lesen
  500.            kann, noch der Programmierer, weil er nach 3 Monaten nicht
  501.            mehr weiß, wie sein Programm funktionierte.
  502.  
  503.         d) Neuentwicklungen
  504.  
  505.            Ich glaube, hier gibt es noch einiges zu machen als da wären:
  506.  
  507.             1) DualPlayfields
  508.  
  509.                Um auch einen unabhängigen Hintergrund darstellen zu
  510.                können wäre eine Routine erforderlich, welche im
  511.                DualPlayFiled-Modus IFF-Bilddaten lädt und diese in
  512.                einem entsprechende Screen speichert. Wie's dann
  513.                weitergeht, weiß ich nicht.
  514.  
  515.             2) Eine Joystickabfrage für den Port1 bzw. eine
  516.                Mausabfrage.
  517.  
  518.             und so weiter, und so weiter.
  519.  
  520.             Ihr seht, es sind keine Grenzen gesetzt.
  521.  
  522.  
  523. Copyrights
  524. ----------
  525.  
  526.     Die Copyrights für diese Routinen liegen bei mir.
  527.     ( (c) 1992, 1993 Jörg Wach )
  528.  
  529.     Ich erlaube allerdings, daß diese Routinen in anderen Programme
  530.     eingesetzt werden dürfen, sofern diese nicht für gewerbsmäßige
  531.     Zwecke verwendet werden.
  532.  
  533.     Gewerbsmäßig bedeutet, daß die Routinen in einem anderen
  534.     Softwareprodukt genutzt oder benutzt werden und dieses
  535.     Softwareprodukt gegen einen Geldwert an Dritte verkauft
  536.     oder verliehen wird.
  537.  
  538.     In diesem Fall bestehe ich auf die Übersendung einer Kopie
  539.     des Programmes sowie auf den Abschluß eines Nutzungsvertrages.
  540.  
  541.     Die Nichtbeachtung kann zu einer strafrechtlichen Verfolgung
  542.     führen.
  543.  
  544.     Ich persönlich möchte hiermit keinen abschrecken, der meine Routinen
  545.     verwendet und möchte auch nur sehen, was mit meinen Routinen so
  546.     passiert, aber bei einer gewerbsmäßigen Verwendung in einem
  547.     Produkt betrachte ich es schon als unfair, wenn ich für die
  548.     erbrachte Arbeit nicht entlohnt werde, zumal es sich hierbei um
  549.     harte Basisarbeit gehandelt hat.
  550.  
  551.     Sollte jemand auf die Idee kommen und die Routinen zu
  552.     modifizieren oder zu optimieren so bitte ich doch um die
  553.     Übersendung der neuen Routinen. Auch ich kann noch was lernen!
  554.  
  555.  
  556. 7.  Dateiverzeichnis
  557.  
  558.     Folgende Dateien sollte das Gesamtpacket umfassen:
  559.  
  560.         GAME.MOD    ---> Der Sourcecode
  561.         GAME.I      ---> das Includefile
  562.         GAME.DOC    ---> na was wohl ?
  563.         GAME.LIB    ---> Die Library für Blink
  564.         sowie die entsprechenden Info.-Files.
  565.  
  566. Historie
  567. --------
  568.  
  569.     V1.20 ---> 07.06.1993
  570.  
  571.                Nach diversem Grauen und Schrecken sind jetzt die Funktionen
  572.                für den Vertikal-Blank-Server (war eigentlich leicht) und
  573.                für die Sound-Routine (DAS Grauen) hinzugekommen.
  574.  
  575.                Ausreichend alles getestet und in die neue Version von
  576.                Ufo2 (2.2) eingebaut.
  577.  
  578.                Viel Spaß!
  579.  
  580.     V1.10 ---> 05.09.1992
  581.  
  582.                - Warum hat mir keiner gesagt, daß in der Graphics.Library
  583.                  ein BUG ist?
  584.                  Bei Verwendung der BltBitMap-Routine muß der y-Bereich
  585.                  um eins erhöht werden!
  586.                  Deshalb klappten meine Grafikkollisionsabfragen nicht,
  587.                  und ich dachte schon, ich werd verrückt (oder bin es?).
  588.  
  589.                - Die Routine DrawObjekt ist jetzt absolut neu geschrieben
  590.                  worden. Ich habe dazu lernen müssen, wie der Blitter
  591.                  arbeitet, abstürzt, aufstürzt ..... na ja, und so
  592.                  weiter, aber es hat sich gelohnt.
  593.                  Gegenüber der DrawImage-Funktion aus der Intuition.Lib,
  594.                  die ich sonst verwendet habe, ist das Zeichnen jetzt
  595.                  wesentlich schneller geworden.
  596.                  Echt stark.
  597.  
  598.     V1.04 --->  28.08.92
  599.  
  600.                 - Die Funktionen DrawObjekt und UnDrawObjekt funk-
  601.                   tionieren jetzt auch mit gelöschten Objekten. D.h.
  602.                   diese werden beim zeichnen einfach übergangen.
  603.  
  604.                 - Die Funktion CollObjekt ist verbessert worden. Fol-
  605.                   gendes habe ich angepaßt:
  606.                   a) Unterscheidung, ob von/bis-Bereich richtig angege-
  607.                      ben wurde, sprich zuerst der kleinere und dann der
  608.                      größere Wert.
  609.                      Wenn dies nicht der Fall ist werden beide Werte
  610.                      vertauscht.
  611.                   b) Hab einen CMP gegen einen TST getauscht.
  612.                   c) Wenn der von/bis-Bereich gleich ist muß eine geson-
  613.                      derte Besetzung der Startwerte erfolgen.
  614.                      Dieses war ein klarer BUG!
  615.                   d) Die Routine zur Ermittlung der Objektadresse habe
  616.                      ich so geändert, daß jetzt der Mulu-Befehl zum Zuge
  617.                      kommt.
  618.                      Ist wesentlich schneller (70 Zyklen) als meine ehe-
  619.                      malige additionsroutine ( 30 Zyklen * Nummer des
  620.                      Objektes, also bei z.B. 200 Objekten = 6000 Zyklen).
  621.  
  622.     V1.03 --->  22.08.92
  623.  
  624.                 - Die Funktion CollObjekt ist so abgeändert worden, daß
  625.                   nur noch SizeX und SizeY des zu betrachtenden Aus-
  626.                   schnittes mitgegeben werden brauchen.
  627.                   Warum ich das geändert habe? Weil alle Routinen der
  628.                   Game.Mod mit den SizeX bzw. SizeY-Werten arbeiten.
  629.  
  630.                 - Die maximale Anzahl von Picture-Pointern habe ich
  631.                   auf 100 erhöht. Kann ja sein, daß man soviel braucht.
  632.                   Kostet auf jedenfall nicht viel Platz (400 Byte).
  633.  
  634.                 - Die UndrawObjekt-Routine ist schneller geworden, weil
  635.                   ein löschen jetzt mit RectFill erfolgt.
  636.  
  637.     V1.02 --->  14.08.92
  638.  
  639.                 - Neue Proceduren PowerLEDON und PowerLEDOFF, um mit
  640.                   der PowerLED ein Bischen rumzuspielen.
  641.  
  642.                 - Pictures sind jetzt als Imagepointer zu betrachten!
  643.                   Wer mit der alten Version was programmiert hat
  644.                   sollte dieses beachten.
  645.  
  646.                 - Die Routine DrawObjekt ist abgeändert worden. Es
  647.                   können jetzt keine Plane-Masken mehr vorgegeben werden,
  648.                   damit das Aussehen eines Bildes nicht verändert wird.
  649.  
  650.     V1.01 --->  08.06.92
  651.  
  652.                 - Neue Procedure IntToStr6, die Zahlen bis 999999 in
  653.                   das Stringformat mit führenden Nullen konvertiert, wie
  654.                   von professionellen Spielen gewohnt.
  655.  
  656. So, nun schreibt mal schön eure Programme mit den Routinen und vergesst
  657. bitte nicht, mir eine Kopie zu schicken (natürlich auf Diskette). Ihr
  658. erhaltet die Diskette mit PD-Soft oder der neuesten SoftWare aus meinen
  659. Fingern zurück.
  660.  
  661. PCQ, Take it or Break it
  662.  
  663.  
  664.       !!                             !!!!! !!!!! !   ! !!!!! !!!!!
  665.       !!                             !! !! !! !! !   ! !!    !! !!
  666.       !!                             !!!!! !! !! !   ! !!!!! !!!!!
  667.      !!!                             !!    !! !! ! ! ! !!    !!!
  668.    !!!!                              !!    !!!!! !!!!! !!!!! !! !!
  669.  
  670.            !!!!
  671.            !!                        Jörg Wach
  672.            !!                        Waitzstr. 75
  673.            !!
  674.            !!!!                      2300 Kiel 1
  675.                                      Neue PLZ ab 1.7.93: 24105
  676.                   !!                 Tel.: 0431/57 84 85
  677.                   !!
  678.                   !!                 Westdeutschland
  679.                   !!
  680.                   !!!!!              07.06.93
  681.  
  682.